<?php
// +----------------------------------------------------------------------
// | Author: yaoyihong <510974211@qq.com>
// +----------------------------------------------------------------------
namespace addon\payment\logic;
use app\common\logic\LogicBase;
use \tpfcore\Core;

class Pay extends LogicBase
{
	public function alipay_notify($data){
		//商户订单号
		$order_sn = $data['out_trade_no'];
		$order=Core::loadModel("Order")->getColumns(['order_sn'=>$order_sn],"order_sn,pay_handle,pay_code");
		$pay_config=$order?Core::loadAddonModel("Payment",'','controller')->getPaymentConfig($order[$order_sn]['pay_handle'],$order[$order_sn]['pay_code']):[];
		if($pay_config){
			$config['gatewayUrl']="https://openapi.alipay.com/gateway.do";
			$config['app_id']=$pay_config['appId'];
			$config['merchant_private_key']=$pay_config['rsaPrivateKey'];
			$config['alipay_public_key']=$pay_config['alipayrsaPublicKey'];
			$config['charset']=empty($pay_config['charset'])?"UTF-8":$pay_config['charset'];
			$config['sign_type']=empty($pay_config['signType'])?"RSA2":$pay_config['signType'];
		}
		$alipaySevice = new \AlipayTradeService($config);
		$result = $alipaySevice->check($data);

		/* 实际验证过程建议商户添加以下校验。
		1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
		2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
		3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
		4、验证app_id是否为该商户本身。
		*/
		if($result) {//验证成功
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代

			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			
		    //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

			//支付宝交易号
			$trade_no = $data['trade_no'];
			//交易状态
			$trade_status = $data['trade_status'];

		    if($trade_status == 'TRADE_FINISHED') {
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
					//如果有做过处理，不执行商户的业务程序	
				//注意：
				//退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
				$order['order_status']=1;
				$order['shipping_status']=3;
				$order['pay_status']=1;
		    }
		    else if ($trade_status == 'TRADE_SUCCESS') {
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
					//如果有做过处理，不执行商户的业务程序			
				//注意：
				//付款完成后，支付宝系统发送该交易状态通知
		    	$order['order_status']=1;
				$order['pay_status']=1;
				$order['pay_time']=time();
		    }
			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
			echo "success";	// 请不要修改或删除
		}else {
			$order['pay_status']=4;
		    //验证失败
		    echo "fail";
		}
		Core::loadModel("Order")->updateObject(['order_sn'=>$order_sn],$order);
	}
	public function alipay_return($data){
		//商户订单号
		$order_sn = $data['out_trade_no'];
		$order=Core::loadModel("Order")->getColumns(['order_sn'=>$order_sn],"order_sn,pay_handle,pay_code,order_status,pay_status,pay_time");
		$pay_config=$order?Core::loadAddonModel("Payment",'','controller')->getPaymentConfig($order[$order_sn]['pay_handle'],$order[$order_sn]['pay_code']):[];
		if($pay_config){
			$config['gatewayUrl']="https://openapi.alipay.com/gateway.do";
			$config['app_id']=$pay_config['appId'];
			$config['merchant_private_key']=$pay_config['rsaPrivateKey'];
			$config['alipay_public_key']=$pay_config['alipayrsaPublicKey'];
			$config['charset']=empty($pay_config['charset'])?"UTF-8":$pay_config['charset'];
			$config['sign_type']=empty($pay_config['signType'])?"RSA2":$pay_config['signType'];
			$alipaySevice = new \AlipayTradeService($config);
			$result = $alipaySevice->check($data);
			/* 实际验证过程建议商户添加以下校验。
			1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
			2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
			3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
			4、验证app_id是否为该商户本身。
			*/
			if($result) {	//验证成功
				return $order;
			}else {
				throw new \Exception("非法的请求", 1);
			}
		}else {
			throw new \Exception("非法的请求", 1);
		}
		
	}
	public function weixin_notify($data){
		$xml= file_get_contents('php://input');
		$data=(new \WxPayDataBase())->FromXml($xml);
		$order_sn=$data['out_trade_no'];

		// 如果有订单号
		if($order_sn){
			$order=Core::loadModel("Order")->getColumns(['order_sn'=>$order_sn],"order_sn,pay_handle,pay_code");
			$pay_config=$order?Core::loadAddonModel("Payment",'','controller')->getPaymentConfig($order[$order_sn]['pay_handle'],$order[$order_sn]['pay_code']):[];
			new \WxPayConfig($pay_config);

			$notify = new \PayNotifyCallBack();
			$notify->Handle(false);

			if($notify->GetReturn_code()=="SUCCESS"){				// 支付成功
				// 改变状态状态
				$order['order_status']=1;
				$order['pay_status']=1;
				$order['pay_time']=time();
			}else{
				$order['pay_status']=4;
			}
			Core::loadModel("Order")->updateObject(['order_sn'=>$order_sn],$order);
		}
	}
	public function weixin_h5_notify($data){
		$order_sn=$data['out_trade_no'];
		// 如果有订单号
		if($order_sn){
			$order=Core::loadModel("Order")->getColumns(['order_sn'=>$order_sn],"order_sn,pay_handle,pay_code");
			$pay_config=$order?Core::loadAddonModel("Payment",'','controller')->getPaymentConfig($order[$order_sn]['pay_handle'],$order[$order_sn]['pay_code']):[];
			new \WxPayConfig($pay_config);
			$notify = new \PayNotifyWap();
			if($notify->requestSignVerify($data)){				// 支付成功
				// 改变状态状态
				$order['order_status']=1;
				$order['pay_status']=1;
				$order['pay_time']=time();
			}else{
				$order['pay_status']=4;
			}
			Core::loadModel("Order")->updateObject(['order_sn'=>$order_sn],$order);
		}
	}
	public function weixin_retrun($data){
		return true;
	}
}